給定n表示高程圖的非負整數,其中每個長條的寬度為1,計算下雨後它可以捕獲多少水。
輸入: height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
解釋:上面的高程圖(黑色部分)由數組 [0,1 表示, 0,2,1,0,1,3,2,1,2,1]。在本例中,有 6 個單位的雨水(藍色部分)被截留。
class Solution {
public int trap(int[] height) {
int l = 0;
int r = height.length-1;
int left_max = height[0];
int right_max = height[r];
int water = 0;
while(l<r){
if(left_max<=right_max){
water += (left_max-height[l]);
l++;
left_max = Math.max(left_max,height[l]);
}else{
water += (right_max-height[r]);
r--;
right_max = Math.max(right_max,height[r]);
}
}
return water;
}
}
這種方法背後的直覺在於觀察到兩個條之間截留的水量取決於從左側和右側遇到的條的最大高度的最小值。
初始化:初始化兩個指標l和r,分別指向陣列的開頭和結尾。另外,初始化變數left_max並right_max分別儲存從左側和右側遇到的條形的最大高度。初始化water為 0 以追蹤總截留水量。
遍歷數組:使用 while 迴圈從左到右迭代數組(直到l小於r)。在每次迭代期間,比較left_max和right_max來決定朝哪一邊移動。
處理左側:如果left_max小於或等於right_max,則表示左側可能會積水。將變數增加索引 處目前條形與高度water之間的差異。將左指針 ( ) 向右移動一步,並根據需要進行更新。left_maxllleft_max
處理右側:如果right_max小於left_max,則表示右側可能會積水。將變數增加索引 處目前條形與高度water之間的差異。將右指標 ( ) 向左移動一步並根據需要進行更新。right_maxrrright_max
回傳結果:一旦循環完成(l變得大於或等於r),就返回截留的總水量。